/*给定一个数组和滑动窗口的大小，找出所有滑动窗口里数值的最大值。
* 例如，如果输入数组{2,3,4,2,6,2,5,1}及滑动窗口的大小3，那么一共存在6个滑动窗口，
* 他们的最大值分别为{4,4,6,6,6,5}； 针对数组{2,3,4,2,6,2,5,1}的滑动窗口有以下
* 6个： {[2,3,4],2,6,2,5,1}， {2,[3,4,2],6,2,5,1}， {2,3,[4,2,6],2,5,1}，
* {2,3,4,[2,6,2],5,1}， {2,3,4,2,[6,2,5],1}， {2,3,4,2,6,[2,5,1]}。
* 窗口大于数组长度的时候，返回空
*
* 输入：[2,3,4,2,6,2,5,1],3
* 返回值：[4,4,6,6,6,5]
 * */


package test;

import java.util.*;

public class JZ64 {

    public static void main(String[] args) {

        JZ64 obj = new JZ64();
        int[] num = {2,3,4,2,6,2,5,1};
        int size = 3;
        System.out.println(obj.maxInWindows(num, size));
    }

    public ArrayList<Integer> maxInWindows(int[] num, int size){

        int len = num.length;
        ArrayList<Integer> res = new ArrayList<>();
        if (size > len || size == 0){
            return res;
        }
        int max = getMax(num, 0, size - 1);
        res.add(max);
        for (int j = size; j < len; j++) {

            int x = num[j], y = num[j - size];
            if (y != max && x < max){
                res.add(max);
            }else if (x >= max){
                max = x;
                res.add(max);
            }else if (y == max && x < max){
                max = getMax(num, j - size + 1, j);
                res.add(max);
            }
        }
        return res;
    }

    public int getMax(int[] num, int i, int j){

        int max = 0;
        for (int k = i; k <= j; k++) {
            if (num[k] > max){
                max = num[k];
            }
        }
        return max;
    }
}
